package service;

import dao.OrderDao;
import factory.DaoFactory;
import model.Order;
import model.User;
import model.RedWine;
import factory.ServiceFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

public class OrderServiceImpl implements OrderService { //订单业务逻辑实现 完成人：姜凯严、邓亦明 7/5
    private OrderDao orderDao = DaoFactory.getOrderDao(); //
    private RedWineService redWineService = ServiceFactory.getRedWineService(); //

    @Override
    public boolean addOrder(Order order) { // 添加订单
        return orderDao.addOrder(order); //
    }

    @Override
    public boolean updateOrder(Order order) { // 修改订单
        return orderDao.updateOrder(order); //
    }

    @Override
    public boolean deleteOrder(int orderId) { // 删除订单
        return orderDao.deleteOrder(orderId); //
    }

    @Override
    public Order findOrder(int orderId) { // 根据订单ID查找订单
        return orderDao.findOrder(orderId); //
    }

    @Override
    public List<Order> findAll() { // 查询所有订单
        return orderDao.findAll(); //
    }

    @Override
    public int processRedWinePurchase(User user, Map<Integer, Integer> purchaseItems, int onlineFlag) { // <--- 确保签名匹配接口
        if (user == null || purchaseItems == null || purchaseItems.isEmpty()) { //
            return -1; // 参数无效
        }

        List<Order> newOrders = new ArrayList<>(); //
        Map<Integer, Integer> redWineStockChanges = new HashMap<>(); //

        // 准备订单列表和库存变化映射
        for (Map.Entry<Integer, Integer> entry : purchaseItems.entrySet()) { //
            int redWineId = entry.getKey(); //
            int quantity = entry.getValue(); //

            // 在Service层再次校验库存（即便UI层已做，Service层做业务校验更严谨）
            RedWine redWine = redWineService.findById(redWineId); //
            if (redWine == null || redWine.getStock() < quantity) { //
                System.err.println("错误：红酒ID " + redWineId + " 库存不足或不存在。"); //
                return -1; // 校验失败，整个购买失败
            }

            // 创建Order对象（这里不设置order_id和code，由DAO层批量处理时设置）
            Order order = new Order(); //
            order.setUserId(user.getUserId()); //
            order.setRedWineId(redWineId); //
            order.setQuantity(quantity); //
            order.setStatus(Order.OrderStatus.未付款); // 初始状态为未付款
            order.setOnline(onlineFlag == 1); // <--- 使用传入的 onlineFlag 参数

            newOrders.add(order); //
            redWineStockChanges.put(redWineId, quantity); // 记录需要减少的库存数量
        }

        // 调用 DAO 层进行批量操作，由 DAO 层处理事务和标识码生成
        return orderDao.addOrdersBatchAndUpdateStocks(newOrders, redWineStockChanges); //
    }

    @Override
    public boolean updateOrdersStatusByCode(int orderCode, Order.OrderStatus newStatus) { //
        return orderDao.updateOrdersStatusByCode(orderCode, newStatus); //
    }
}